/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package me.yobol.algorithm.basic.value;

/**
 *
 * @author Yobol
 * 
 */
public class Swap {
    /**
     * Java参数是数值传递
     * 
     * 使用swap(a,b)并不能改变实参的值
     * 
     * @param a
     * @param b 
     */
    public static void swap(int a,int b){
        if (a != b) {
            int temp = a;
            a = b;
            b = temp;
        }
    }
    
    /**
     * 使用临时变量实现数值型数据交换
     * 
     * 缺点：使用临时变量浪费内存空间
     * 优点：节省时间
     * @param a
     * @param b 
     */
    public static void swap1(int data[],int a,int b){
        if (a != b) {
            int temp = data[a];
            data[a] = data[b];
            data[b] = temp;
        }
    }
    
    /**
     * 使用加减运算实现数值型数据交换
     * 
     * 缺点：若考虑到编译时会出现溢出的问题，导致得到错误的结果；耗费时间
     * 优点：节省内存空间
     * @param a
     * @param b 
     */
    public static void swap2(int data[],int a,int b){
        if (a != b) {
            data[a] = data[a] + data[b];
            data[b] = data[a] - data[b];
            data[a] = data[a] - data[b];
        }
    }
    
    /**
     * 使用异或运算实现数值型数据交换
     * 
     * 缺点：耗费时间
     * 优点：节省时间
     * @param a
     * @param b 
     */
    public static void swap3(int data[],int a,int b){
        if (a != b) {
            data[a] = data[a] ^ data[b];
            data[b] = data[a] ^ data[b];
            data[a] = data[a] ^ data[b];
        }
    }
    
    public static void main(String[] args) {
        int data[] = new int[]{1,2};
        System.out.println(data[0] + " " + data[1]);
        
        swap1(data,0,1);
        System.out.println(data[0] + " " + data[1]);
        
        swap2(data, 0,1);
        System.out.println(data[0] + " " + data[1]);
        
        swap3(data, 0,1);
        System.out.println(data[0] + " " + data[1]);
    }
}
